package com.tang.myapplication;

// 导入必要的Android库和Java网络库
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 主Activity类，负责与ESP32设备通信并控制阀门
 */
public class MainActivity extends AppCompatActivity {

    // UI组件引用
    private TextView tvStatus, tvCurrentPercentage, tvTargetPercentage, tvFeedback;
    private Button btnConnect, btnOpen, btnClose, btn0, btn25, btn50, btn75, btn100;
    private EditText etIpAddress, etPort;
    private View connectionIndicator;

    // 连接状态和服务器配置
    private boolean isConnected = false;
    private String serverIp = "192.168.4.1"; // 默认ESP32 IP地址
    private int serverPort = 80; // HTTP默认端口

    /**
     * 初始化UI组件和事件监听器
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 设置布局文件

        // 初始化UI组件
        tvStatus = findViewById(R.id.tvStatus); // 显示连接状态
        tvCurrentPercentage = findViewById(R.id.tvCurrentPercentage); // 显示当前阀门百分比
        tvTargetPercentage = findViewById(R.id.tvTargetPercentage); // 显示目标阀门百分比
        tvFeedback = findViewById(R.id.tvFeedback); // 显示操作反馈信息
        btnConnect = findViewById(R.id.btnConnect); // 连接/断开连接按钮
        etIpAddress = findViewById(R.id.etIpAddress); // IP地址输入框
        etPort = findViewById(R.id.etPort); // 端口号输入框
        connectionIndicator = findViewById(R.id.connectionIndicator); // 连接状态指示器

        // 初始化阀门控制按钮
        btn0 = findViewById(R.id.btn0); // 0%阀门开度按钮
        btn25 = findViewById(R.id.btn25); // 25%阀门开度按钮
        btn50 = findViewById(R.id.btn50); // 50%阀门开度按钮
        btn75 = findViewById(R.id.btn75); // 75%阀门开度按钮
        btn100 = findViewById(R.id.btn100); // 100%阀门开度按钮

        // IP地址输入验证
        etIpAddress.addTextChangedListener(new TextWatcher() {
            @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
            @Override public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void afterTextChanged(Editable s) {
                String ip = s.toString();
                if (!isValidIpAddress(ip)) {
                    etIpAddress.setError("请输入有效的IP地址"); // 显示错误提示
                } else {
                    etIpAddress.setError(null); // 清除错误提示
                }
            }

            /**
             * 验证IP地址格式是否有效
             * @param ip 要验证的IP地址字符串
             * @return 如果IP有效返回true，否则返回false
             */
            private boolean isValidIpAddress(String ip) {
                if (ip.isEmpty()) return true; // 允许空值（用户可能还未输入）
                String[] parts = ip.split("\\."); // 使用正则表达式分割IP地址
                if (parts.length > 4) return false; // IP地址最多4部分
                for (String part : parts) {
                    if (!part.isEmpty()) {
                        try {
                            int num = Integer.parseInt(part);
                            if (num < 0 || num > 255) return false; // 每部分必须在0-255之间
                        } catch (NumberFormatException e) {
                            return false; // 非数字格式无效
                        }
                    }
                }
                return true;
            }
        });

        // 阀门控制按钮点击事件
        btn0.setOnClickListener(v -> {
            tvTargetPercentage.setText("0%"); // 更新目标百分比显示
            sendCommand("0"); // 发送命令到ESP32
        });

        btn25.setOnClickListener(v -> {
            tvTargetPercentage.setText("25%");
            sendCommand("1");
        });

        btn50.setOnClickListener(v -> {
            tvTargetPercentage.setText("50%");
            sendCommand("2");
        });

        btn75.setOnClickListener(v -> {
            tvTargetPercentage.setText("75%");
            sendCommand("3");
        });

        btn100.setOnClickListener(v -> {
            tvTargetPercentage.setText("100%");
            sendCommand("4");
        });

        // 连接按钮点击事件
        btnConnect.setOnClickListener(v -> {
            if (!isConnected) { // 当前未连接，尝试连接
                serverIp = etIpAddress.getText().toString().trim();
                String portStr = etPort.getText().toString().trim();

                if (serverIp.isEmpty() || portStr.isEmpty()) {
                    tvFeedback.setText("请输入有效的IP地址和端口号");
                    return;
                }

                try {
                    serverPort = Integer.parseInt(portStr);
                    new ConnectTask().execute(); // 执行异步连接任务
                } catch (NumberFormatException e) {
                    tvFeedback.setText("端口号格式不正确");
                }
            } else {
                disconnect(); // 当前已连接，断开连接
            }
        });
    }

    /**
     * 异步连接任务类，用于在后台线程中执行网络连接操作
     * 避免阻塞UI线程导致界面卡顿
     */
    private class ConnectTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected void onPreExecute() {
            // 任务执行前的准备工作
            tvFeedback.setText("正在连接 " + serverIp + ":" + serverPort + "...");
            btnConnect.setEnabled(false); // 禁用连接按钮防止重复点击
            btnConnect.setText("连接中...");
        }

        @Override
        protected Boolean doInBackground(Void... voids) {
            // 在后台线程中执行网络连接
            HttpURLConnection urlConnection = null;
            try {
                //创建URL对象
                URL url = new URL("http://" + serverIp + ":" + serverPort);
                //打开Http连接
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET"); // 使用GET请求测试连接
                urlConnection.setConnectTimeout(3000); // 设置连接超时时间为3秒
                //建立连接
                urlConnection.connect();
                // 返回连接是否成功（HTTP 200状态码表示成功）
                return urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK;
            } catch (Exception e) {
                return false; // 发生异常，连接失败
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect(); // 关闭连接
                }
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // 任务执行完成后的UI更新
            isConnected = result;
            btnConnect.setEnabled(true); // 重新启用连接按钮

            if (isConnected) {
                // 连接成功处理
                connectionIndicator.setBackgroundResource(R.drawable.circle_green); // 设置指示器为绿色
                tvStatus.setText("已连接");
                tvStatus.setTextColor(Color.parseColor("#4CAF50")); // 设置状态文本为绿色
                btnConnect.setText("断开连接");
                tvFeedback.setText("已成功连接到设备\n可以开始控制阀门");

                // 启用控制按钮
                btn0.setEnabled(true);
                btn25.setEnabled(true);
                btn50.setEnabled(true);
                btn75.setEnabled(true);
                btn100.setEnabled(true);
            } else {
                // 连接失败
                connectionIndicator.setBackgroundResource(R.drawable.circle_red); // 设置指示器为红色
                tvStatus.setText("连接失败");
                tvStatus.setTextColor(Color.parseColor("#F44336")); // 设置状态文本为红色
                btnConnect.setText("连接设备");
                tvFeedback.setText("无法连接到设备\n请检查IP地址、端口和网络连接");

                // 禁用控制按钮
                btn0.setEnabled(false);
                btn25.setEnabled(false);
                btn50.setEnabled(false);
                btn75.setEnabled(false);
                btn100.setEnabled(false);
            }
        }
    }

    /**
     * 发送命令到ESP32设备
     * @param command 要发送的命令字符串
     */
    private void sendCommand(final String command) {
        // 1. 检查连接状态
        if (!isConnected) {
            runOnUiThread(() -> tvFeedback.setText("错误: 未连接设备"));
            return;
        }

        // 2. 创建新线程执行网络操作
        new Thread(() -> {
            HttpURLConnection urlConnection = null;
            try {
                // 3. 创建URL对象
                URL url = new URL("http://" + serverIp + ":" + serverPort);

                // 4. 打开HTTP连接
                urlConnection = (HttpURLConnection) url.openConnection();

                // 5. 配置HTTP请求
                urlConnection.setRequestMethod("POST");
                urlConnection.setDoOutput(true);
                urlConnection.setConnectTimeout(3000);

                // 6. 准备发送数据
                String postData = "mode=" + command;

                // 7. 发送数据
                OutputStream os = urlConnection.getOutputStream();
                os.write(postData.getBytes());
                os.flush();
                os.close();

                // 8. 处理响应
                if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    // 读取响应内容
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(urlConnection.getInputStream()));
                    String response = in.readLine();
                    in.close();

                    // 9. 在UI线程更新界面
                    runOnUiThread(() -> {
                        tvFeedback.setText("设置成功: " + response);
                        // 解析响应中的角度值
                        if (response.contains("angle mode set to: ")) {
                            String angleStr = response.substring(response.indexOf(": ") + 2);
                            tvCurrentPercentage.setText(angleStr);
                        }
                    });
                }
            } catch (Exception e) {
                // 10. 错误处理
                runOnUiThread(() -> {
                    tvFeedback.setText("发送失败: " + e.getMessage());
                    disconnect();
                });
            } finally {
                // 11. 清理资源
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }
        }).start(); // 启动线程执行网络操作
    }

    /**
     * 断开与ESP32的连接并更新UI状态
     */
    private void disconnect() {
        //更新连接状态标志
        isConnected = false;
        //更新UI状态
        connectionIndicator.setBackgroundResource(R.drawable.circle_red); // 设置指示器为红色
        tvStatus.setText("未连接");
        tvStatus.setTextColor(Color.parseColor("#F44336")); // 设置状态文本为红色
        btnConnect.setText("连接设备");
        tvFeedback.setText("已断开连接");

        // 禁用控制按钮
        btn0.setEnabled(false);
        btn25.setEnabled(false);
        btn50.setEnabled(false);
        btn75.setEnabled(false);
        btn100.setEnabled(false);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        disconnect(); // Activity销毁时断开连接，释放资源
    }
}